package com.cskaoyan.javase._1interface._1basic;

/**
 * 接口的成员特点和使用
 * 自此，我们已经引入了接口的概念。接下来，我们重点来研究一个接口的特点和使用。
 *
 * 接口的特点我们主要研究以下方面
 *      1.接口的声明特点
 *          接口和类一样,它的访问权限修饰符一样,默认或者public(如果是嵌套接口,则不同)
 *          接口是抽象的,它也不能new对象
 *              实际上接口的声明列表中隐含了修饰符 abstract
 *              特别提升:接口中的隐含修饰符不要写出来,写出来是多余的
 *
 *      2.接口的实现类的书写格式
 *          某些程序员喜欢在写接口实现类时,在同包下创建一个包"impl"
 *          用来存放该接口的实现类"接口名 + Impl"
 *          表示它是某个接口的实现类
 *
 *      3.成员特点
 *          接口中是允许定义属性/数据的
 *          但是该属性隐含的被
 *              "public static final"修饰
 *              接口中只能定义全局常量
 *              隐含的修饰符不要写出来
 *              注:
 *                  a.接口中所有的结构都是public修饰的,而且是不可以更改访问权限修饰符的
 *                  b.接口在95%的情况下,都不应该定义属性(接口仅仅表示功能的扩展)
 *                      只有在接口的所有实现类都需要一个全局常量时
 *                      才把这个全局常量,放在接口中(很少见的情况)
 *                  c.接口中的全局常量
 *                      不能用静态代码块赋值(因为接口中没有静态代码块)
 *                      只能直接显式赋值
 *                  d.接口中的全局常量,可以接口名点使用
 *                      也可以子类类名点使用
 *
 *          接口中是允许定义抽象方法的:
 *              实际上在Java8之前,接口中只能定义抽象方法
 *              接口中的抽象方法,默认都是"public abstract"修饰的,但是不要写出隐含的修饰符
 *              绝大多数接口中,都只有抽象方法,接口的定义往往非常简洁
 *
 *              在Java8及其以后,接口中是允许定义实现方法(带大括号的)
 *
 *          构造器: 接口没有构造器,它不需要,子类也不需要
 *
 *          代码块: 没有构造器就没有构造代码块,也没有静态代码块
 *
 *
 * 以上接口的成员特点说完了,总结:
 *      1.允许定义全局常量,但是很少定义
 *      2.可以定义抽象方法,也允许定义实现方法(Java8之后)
 *      3.没有其他结构了
 *
 * 接口的实现类(使用关键字implements)特点:
 *      1.普通类,必须实现所有抽象方法.
 *      2.抽象类,不需强制实现抽象方法,可以选择实现
 *
 * 总结一下，接口和类的继承/实现的规则：
 * 总体原则:
 *      继承（extends）是不能跨越种族的，类和类继承，接口和接口继承
 *      接口和类之间没有继承关系,是类实现(implements)接口
 *
 *      普通类继承一个抽象类，需要实现里面的所有抽象方法。
 *      抽象类继承一个抽象类，按需实现里面的抽象方法。
 *      抽象类继承一个普通类，是可以的。
 *
 *      接口在继承一个接口后，会得到接口的所有抽象方法。
 *      类的继承是单继承的，接口的继承是多继承的。(语法问题知道个大概就行了)
 *
 * 实现（implements），必须发现在类与接口之间，接口和类是没有任何关系的。
 * 普通类实现接口，必须实现所有抽象方法
 * 抽象类实现接口，按需实现抽象方法
 *
 * @since 10:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Modifier 'abstract' is redundant for interfaces
public interface IDemo {

    // 接口中的mian方法
    public static void main(String[] args) {
        System.out.println("hello world!");
    }

    // Variable 'a' might not have been initialized
    // final int a;
    public static final int NUM = 100;

    // 接口中没有静态代码块
    // static {}

    // 抽象方法
    void test();

}

interface IA {
    // 如果真要在接口中定义属性,那么就直接下面的定义方法
    int NUM = 10;
    double NUM2 = 20;

    // 在接口中定义抽象方法
    void test();

    int test2(int a);
}

// 实际开发中接口大多长下面的样子
interface IB {
    void test();

    int test2(int a);

    double test3();
}

interface IC extends ID,IE{

}

interface ID {
}

interface IE {
}